package com.itheima.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;

public class AOPAdvice {

    public void before(JoinPoint joinPoint) {

        System.out.println("参数数组：" + joinPoint.getArgs());
        System.out.println("目标对象：" + joinPoint.getTarget());
        System.out.println("方法签名：" + joinPoint.getSignature());
        System.out.println("方法名：" + joinPoint.getSignature().getName());

        System.out.println("前值增强:我在方法前执行");
    }

    public void after() {

        System.out.println("最终增强:我在方法后执行-- 总会执行");
    }

    public void afterReturning() {

        System.out.println("后置增强:我在方法后执行");
    }

    public void afterThrowing(Throwable e) {

        System.out.println("捕获异常:" + e.getMessage());
        System.out.println("异常增强:我在方法抛出异常后执行");
    }

    //环绕增强
    //around的返回值就是原始方法的返回值,没有返回值可以是void,有返回值用object
    public void around(ProceedingJoinPoint proceedingJoinPoint) {
        // joinPoint 连接点
        // 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,所有的方法都是连接点
        try {
            System.out.println("前置增强");

            //环绕增强 必须调用原始方法
            proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs()); //可以不传参

            System.out.println("后置增强");

        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("异常增强");

        } finally {
            System.out.println("最终增强");
        }
    }
}